﻿using System;
using System.Windows.Forms;
using System.Messaging;

using Harlinn.Messaging.Common;

namespace Harlinn.Messaging.Client
{
    public partial class ClientMainForm : Form
    {
        private MessageQueue messageQueue;

        public ClientMainForm()
        {
            InitializeComponent();
            InitializeQueue();
        }


        private void InitializeQueue()
        {
            string queuePath = Constants.QueueName;
            if (!MessageQueue.Exists(queuePath))
            {
                messageQueue = MessageQueue.Create(queuePath);
            }
            else
            {
                messageQueue = new MessageQueue(queuePath);
            }
            messageQueue.Formatter = new BinaryMessageFormatter();
        }

        private delegate void LogMessageDelegate(string text);
        private void LogMessage(string text)
        {
            if (InvokeRequired)
            {
                Invoke(new LogMessageDelegate(LogMessage), text);
            }
            else
            {
                messageTextBox.AppendText(text + Environment.NewLine);
            }
        }


        private delegate void EnableSendDelegate();
        private void EnableSend()
        {
            if (InvokeRequired)
            {
                Invoke(new EnableSendDelegate(EnableSend));
            }
            else
            {
                sendButton.Enabled = true;
            }
        }


        private void SendMessages(int count)
        {
            Random random = new Random(count);
            string message = string.Format("Sending {0} messages",count);
            LogMessage(message);
            DateTime start = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                byte b = Convert.ToByte( random.Next(128) );
                int size = random.Next(1024);
                string text = string.Format("Message: Fill {0} {1}",b,size);
                Payload payload = new Payload(text, b, size);
                messageQueue.Send(payload);
            }
            DateTime end = DateTime.Now;
            TimeSpan ts = end - start;
            message = string.Format("{0} messages sent in {1}", count, ts);
            LogMessage(message);
        }

        private void AsychSendMessages(object countAsObject)
        {
            int count = (int)countAsObject;
            SendMessages(count);
            EnableSend();
        }


        private void sendButton_Click(object sender, EventArgs e)
        {
            sendButton.Enabled = false;
            int count = Convert.ToInt32( messageCountNumericUpDown.Value );
            System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(AsychSendMessages), count);
        }

    }
}
